依赖注入(DI)
依赖:备案对象的创建依赖于容器。
注入:bean对象中的所有属性,由容器来注入。
1. 构造器注入
参见Spring -> Inversion of Control -> IoC创建对象的方式。
2. Set方式注入
2.1. 普通类型的注入方式
<bean id="outer" class="...">
<!-- instead of using a reference to a target bean, simply define the target bean inline -->
<property name="target">
<bean class="com.example.Person"> <!-- this is the inner bean -->
<property name="name" value="Fiona Apple"/>
<property name="age" value="25"/>
</bean>
</property>
</bean>
2.2. Properties、List、Map、Set的注入方式
<bean id="moreComplexObject" class="example.ComplexObject">
<!-- results in a setAdminEmails(java.util.Properties) call -->
<property name="adminEmails">
<props>
<prop key="administrator">[email protected]</prop>
<prop key="support">[email protected]</prop>
<prop key="development">[email protected]</prop>
</props>
</property>
<!-- results in a setSomeList(java.util.List) call -->
<property name="someList">
<list>
<value>a list element followed by a reference</value>
<ref bean="myDataSource" />
</list>
</property>
<!-- results in a setSomeMap(java.util.Map) call -->
<property name="someMap">
<map>
<entry key="an entry" value="just some string"/>
<entry key ="a ref" value-ref="myDataSource"/>
</map>
</property>
<!-- results in a setSomeSet(java.util.Set) call -->
<property name="someSet">
<set>
<value>just some string</value>
<ref bean="myDataSource" />
</set>
</property>
</bean>
特别的,上述四种类型还可以通过bean动态增加或者修改里面的内容,使用merge="true"开始更新模式:
<beans>
<bean id="parent" abstract="true" class="example.ComplexObject">
<property name="adminEmails">
<props>
<prop key="administrator">[email protected]</prop>
<prop key="support">[email protected]</prop>
</props>
</property>
</bean>
<bean id="child" parent="parent">
<property name="adminEmails">
<!-- the merge is specified on the child collection definition -->
<props merge="true">
<prop key="sales">[email protected]</prop>
<prop key="support">[email protected]</prop>
</props>
</property>
</bean>
<beans>
2.3. Null和空字符串的注入方式
一个是设置null,一个是设置"".
Null:
<bean class="ExampleBean">
<property name="email">
<null/>
</property>
</bean>
空字符串:
<bean class="ExampleBean">
<property name="email" value=""/>
</bean>
3. 扩展方式注入
以下两种注入方式都需要先添加xml约束头。
3.1. c命名空间注入
c命名空间注入,通过有参构造器进行注入,作用相当于bean下的construct-args,可以在一个标签内完成注入而无需在标签下再创建子标签。
使用方法:
在xml头文件中添加下面的约束
xmlns:c="http://www.springframework.org/schema/c"
进行依赖注入
<!-- c-namespace declaration with argument names --> <bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo" c:thingThree-ref="beanThree" c:email="[email protected]"/>
作用和下面传统的代码相同
<!-- traditional declaration with optional argument names --> <bean id="beanOne" class="x.y.ThingOne"> <constructor-arg name="thingTwo" ref="beanTwo"/> <constructor-arg name="thingThree" ref="beanThree"/> <constructor-arg name="email" value="[email protected]"/> </bean>
c标签也支持通过下标注入有参构造器
<!-- c-namespace index declaration --> <bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree" c:_2="[email protected]"/>
3.2. p命名空间注入
p命名空间注入,通过setter注入属性的值,作用相当于bean下的property,可以在一个标签内完成注入而无需在标签下再创建子标签。
使用方法:
在xml头文件中添加下面的约束
xmlns:p="http://www.springframework.org/schema/p"
进行依赖注入
<bean name="p-namespace" class="com.example.ExampleBean" p:email="[email protected]"/> <bean name="john" class="com.example.Person" p:name="John Doe" p:spouse-ref="jane"/>
作用和下面传统的代码相同
<bean name="classic" class="com.example.ExampleBean"> <property name="email" value="[email protected]"/> </bean> <bean name="john" class="com.example.Person"> <property name="name" value="John Doe"/> <property name="spouse" ref="jane"/> </bean>